home *** CD-ROM | disk | FTP | other *** search
- /* remove.c -- remove an explicitly defined symbol. */
-
- /* This file is part of DLD, a dynamic link/unlink editor for C.
-
- Copyright (C) 1990 by W. Wilson Ho.
-
- The author can be reached electronically by how@cs.ucdavis.edu or
- through physical mail at:
-
- W. Wilson Ho
- Division of Computer Science
- University of California at Davis
- Davis, CA 95616
- */
-
- /* This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 1, or (at your option) any
- later version. */
-
- #include "defs.h"
-
- /*
- * remove a previously defined symbol defined by dld_define().
- * If symbol is not defined by dld_fine, this function becomes no-op.
- */
- void
- dld_remove_defined_symbol (name)
- char *name;
- {
- register symbol *sp;
- register char *p;
-
- if (name == 0)
- return;
-
- p = (char *) _dld_malloc (strlen(name) +2);
- *p = '_';
- strcpy (p+1, name);
-
- sp = _dld_getsym_soft (p);
- free (p);
-
- if (sp->defined_by && sp->defined_by == _dld_dummy_entry) {
- register struct file_chain *p = sp->referenced_by;
- register struct file_chain *prev = 0;
-
- while (p)
- if (p->entry->ref_count == 0) {
- del_link_list_elt (sp->referenced_by, prev, p, next);
- } else {
- p->entry->undefined_symbol_count++;
- prev = p;
- p = p->next;
- }
-
- if (sp->referenced_by) {
- dld_undefined_sym_count++;
- sp->value = 0;
- }
-
- if (sp->defined == (N_COMM | N_EXT) && sp->value) {
- free (sp->value);
- sp->value = 0;
- }
-
- sp->defined = 0;
- sp->defined_by = 0;
-
- if (sp->referenced_by) {
- _dld_patch_all_files (_dld_latest_entry);
- _dld_exec_flags_valid = 0;
- }
- }
-
- } /* dld_remove_defined_symbol */
-